package cn.sccdlg.spring5.ui;

import cn.sccdlg.spring5.factory.BeanFactory;
import cn.sccdlg.spring5.service.AccountService;
import cn.sccdlg.spring5.service.impl.AccountServiceImpl;

/**
 * @author RaoShuang
 * @emil 991207823@qq.com
 * @date 2020/11/2 09:30
 * 模拟一个表现层，用于调用业务层
 */
public class Client {

    public static void main(String[] args) {

        /** 常规获取业务层，可以发现每一次都是不同的对象，并且每一次都需要存在这个类，不然无法编译 */
        for (int i = 0; i < 5; i++) {
            AccountService as = new AccountServiceImpl();
            System.out.println(as);
        }

        System.out.println("=========传说中的分割线=========");

        /** 一般设计的工厂模式，实际解决的是避免直接创建所需对象，但所需对象每次还是会新的一个 */
        for (int j = 0; j < 5; j++) {
            AccountService as = (AccountService) BeanFactory.getBean1("accountService");
            System.out.println(as);
        }

        System.out.println("=========传说中的分割线2=========");

        /** 实际开发中，一个类创建多个对象，而且这些对象实现功能一样，显然多次进行创建就不明智的选择，
         *  此时应对考虑一个实例，即采用工厂创建的对象保存到容器中的方案，它的执行原理是对象只会有一个，存在容器中，
         *  当需要时，通过key值进行获取。
         *  好处：节省了内存开销，并且提升程序的性能
         */
        for (int j = 0; j < 5; j++) {
            AccountService as = (AccountService) BeanFactory.getBean("accountService");
            System.out.println(as);
            as.saveAccount();
        }
    }
}
